/**
 * 给定一个树，有若干个红节点，每个节点赋值1或2，要求使得每个红节点的子树和是3的倍数
 * 构造方案。忘了。
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

template<typename T>
void input(vector<T> & v, int n){
	v.assign(n + 1, {});
	for(int i=1;i<=n;++i) cin >> v[i];
	return;
}

using Real = long double;
using llt = long long;
using vi = vector<int>;
using pii = pair<int, int>;

int N;
vector<vi> G;
string S;
string Ans;

bool proc(int u){
    queue<int> q;
	vi vec;
	q.push(u);
	int k = 0, sz;
	while(sz = q.size()){
		k += sz;
		while(sz--){
            auto h = q.front(); q.pop();
			vec.push_back(h);
			for(auto v : G[h]){
				if('R' != S[v]){
					q.push(v);
				}
			}
		}
	}

	int left = k % 3;
	if(0 == left){
        // for(auto i : vec) Ans[i] = '1';
	}else if(1 == left){
		if(1 == k) return false;
		for(int i=0;i<2;++i) Ans[vec[i]] = '2';
	}else{
		Ans[vec[0]] = '2';
	}
	return true;
}

string proc(){
	Ans.assign(N + 1, '1');
	for(int i=1;i<=N;++i){
		if('R' == S[i]){
			bool flag = proc(i);
			if(not flag) return "-1";
		}
	}
	return Ans.substr(1);
} 

void work(){
    cin >> N >> S;
	S = " " + S;
	G.assign(N + 1, {});
	for(int p,i=2;i<=N;++i){
        cin >> p;
		G[p].push_back(i);
	}
	cout << proc() << "\n";
	return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--) work();
    return 0;
}